/**
 *
    算法描述：通过二维数组模拟地图，然后找规律，对数组内容进行更新
    解决所需数据结构+算法：数组
**/
#include<iostream>
#include<cstring>
using namespace std;
int a[22][22];

int main() {
    memset(a, 0, sizeof(a));
    int n;
    cin >> n;

    /* 
    常规想法：先赋值   再输出
            但是发现边赋值边输出也没问题，所以不需要写两遍重复的for循环了。


    奇思妙想：想一想，这道题目可以直接用一维数组实现。
            为什么可以用一维数组？怎么实现？
    */


    a[1][1] = 1; // 需要确定初始值
    cout << 1 << endl; // 对第一行直接进行输出
    for(int i=2; i<=n; i++) {   // 从第二行开始赋值数组
        for(int j=1; j<=i; j++) {   // 从第一列到第i列
            a[i][j] = a[i-1][j-1] + a[i-1][j];  // 关键赋值代码
            cout << a[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}